package com.dzl.cloud.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import com.dzl.cloud.dao.UserRoleMapper;
import com.dzl.cloud.entity.Role;
import com.dzl.cloud.entity.UserRole;
import com.dzl.cloud.exception.CustomException;
import com.dzl.cloud.service.RoleService;
import com.dzl.cloud.service.UserRoleService;
import com.dzl.cloud.util.JwtUtils;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 光的代言人
 */
@Service("userRoleService")
public class UserRoleServiceImpl implements UserRoleService {
    @Autowired
    private UserRoleMapper userRoleMapper;
    @Autowired
    private RoleService roleService;
    // 绑定默认角色（普通用户）
    @Transactional
    @Override
    public void bindDefaultRole(Long userId) {
        // 获取普通用户角色
        Role userRole = roleService.getRoleByCode("user");
        if (userRole == null) {
            throw new RuntimeException("默认角色 [user] 不存在");
        }
        // 构建 UserRole 对象
        UserRole userRoleRel = new UserRole();
        userRoleRel.setUserId(userId);
        userRoleRel.setRoleId(userRole.getRoleId());

        // 调用 MyBatis-Plus 的 insert 方法
        userRoleMapper.insert(userRoleRel);
    }

    // 查询用户角色编码
    @Override
    public String getUserRoleCode(Long userId) {
        // 使用 MyBatis-Plus 的 LambdaQueryWrapper 查询用户-角色关系
        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getUserId, userId);
        UserRole userRoleRel = userRoleMapper.selectOne(wrapper);

        if (userRoleRel == null) {
            // 未绑定角色
            return null;
        }
        // 根据 role_id 查询角色编码
        Role role = roleService.getRoleByRoleId(userRoleRel.getRoleId());
        return role != null ? role.getRoleCode() : null;
    }

    // 升级用户为管理员
    @Override
    public void upgradeToAdmin(Long userId, Long currentUserId) {
        // 获取当前用户id
//        Long currentUserId = JwtUtils.getUserIdFromToken(token);
        String roleCode = getUserRoleCode(currentUserId);
        if (!checkPermission(roleCode)) {
            throw new CustomException(403, "你没有权限升级该用户！");
        }
        if (userId.equals(currentUserId)) {
            throw new CustomException(405, "不能升级自己！");
        }
        String updateUserRoleCode = getUserRoleCode(userId);
        if("admin".equals(updateUserRoleCode)){
            throw new CustomException(409, "重复操作，该用户已是管理员！");
        }
        // 获取管理员角色
        Role adminRole = roleService.getRoleByCode("admin");
        if (adminRole == null) {
            throw new RuntimeException("管理员角色 [admin] 不存在");
        }
        // 构建 UserRole 对象（仅更新 role_id）
        UserRole userRoleRel = new UserRole();
        userRoleRel.setUserId(userId);
        userRoleRel.setRoleId(adminRole.getRoleId());


        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getUserId, userId);
        // 更新用户角色
        userRoleMapper.update(userRoleRel, wrapper);

        // TODO: 记录角色变更日志
    }

    // 降级用户为普通角色
    @Override
    public void downgradeToUser(Long userId, Long currentUserId) {
        // 获取当前用户id
//        Long currentUserId = JwtUtils.getUserIdFromToken(token);
        // 登录用户角色
        String roleCode = getUserRoleCode(currentUserId);
        if (!checkPermission(roleCode)) {
            throw new CustomException(406, "你没有权限降级该用户！");
        }
        if (userId.equals(currentUserId)) {
            throw new CustomException(407, "不能降级自己！");
        }
        String updateUserRoleCode = getUserRoleCode(userId);
        if("user".equals(updateUserRoleCode)){
            throw new CustomException(408, "重复操作，该用户已是普通用户！");
        }
        // 获取普通用户角色
        Role userRole = roleService.getRoleByCode("user");
        if (userRole == null) {
            throw new RuntimeException("普通用户角色 [user] 不存在");
        }

        // 构建 UserRole 对象（仅更新 role_id）
        UserRole userRoleRel = new UserRole();
        userRoleRel.setUserId(userId);
        userRoleRel.setRoleId(userRole.getRoleId());


        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getUserId, userId);
        userRoleMapper.update(userRoleRel, wrapper);

        // TODO: 记录角色变更日志
    }

    @Override
    public List<Long> getUserIdsByRole(String roleCode) {
        Role role = roleService.getRoleByCode(roleCode);
        // 查询该角色的用户ID
        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getRoleId, role.getRoleId());
        return userRoleMapper.selectList(wrapper).stream().map(UserRole::getUserId).collect(Collectors.toList());
    }
    /**
     * 检查用户权限
     * @param roleCode      角色编码
     * @return 是否有权限
     */
    private boolean checkPermission(String roleCode) {
        // 权限校验逻辑
        if ("super_admin".equals(roleCode)) {
            return true;
        }
        return false;
    }
}
